package com.distribuida.servidor;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;

import com.distribuida.servidor.interfaces.ServidorInterface;
import com.distribuida.supertrunfo.comum.Carta;
import com.distribuida.supertrunfo.comum.Jogador;
import com.distribuida.supertrunfo.facade.SuperTrunfoFacade;
import com.distribuida.supertrunfo.impl.Jogo;
import com.distribuida.supertrunfo.impl.SuperTrunfo;


public class Servidor extends UnicastRemoteObject implements ServidorInterface{

    private static Servidor instance;
    public  ArrayList<Jogo> jogos;
    private SuperTrunfoFacade superTrunfo;
    private static String caminhoXML = "C:/Users/Gustavo/Desktop/arvores_brasileiras.xml";
    public static int porta = 1099;

    protected Servidor() throws RemoteException {
    	super();
    	jogos = new ArrayList<Jogo>();
    	setSuperTrunfo(new SuperTrunfoFacade());
    }


    public static Servidor getInstance(){
    	if(instance == null){
    		try{
    			instance = new Servidor();
    		} catch(Exception e) {
    			e.printStackTrace();
    		}
    	}
    	return instance;
    }

    public  ArrayList<Jogo> getJogos() {
    	return jogos;
    }
    
    public void setJogos(ArrayList<Jogo> jogos) {
    	this.jogos = jogos;
    }
    
    public ArrayList<Jogo> jogosEmAndamento(){
    	ArrayList<Jogo> retorno = new ArrayList<Jogo>(jogos.size());
    	for(Jogo jogo : jogos) {
    		if(jogo.getRodada() >= 0 && ! jogo.podeTerminarJogo()) {
    			retorno.add(jogo);
    		}
    	}
    	return retorno;
    }

    public Jogo getJogoPorId(int id) throws Exception{
    	for(Jogo jogo : jogosEmAndamento()){
    		if(jogo.getId() == id) {
    			return jogo;
    		}
    	}
    	throw new Exception("Jogo inexistente!");
    }
    
    public Jogo BuscarJogoDisponivel(){
    	Jogo jogo = null;
    	for(Jogo jog : jogos){
    		if(jog.getJogadores().size() < 4){
    			jogo = jog;
    		}
    	}
    	if(jogo == null){
    		jogo = new Jogo(new SuperTrunfo(caminhoXML));
    		jogos.add(jogo);
    	}
    	return jogo;
    }

    public SuperTrunfoFacade getSuperTrunfo() {
	return superTrunfo;
    }

    public void setSuperTrunfo(SuperTrunfoFacade superTrunfo) {
	this.superTrunfo = superTrunfo;
    }

    @Override
    public Jogador adicionarJogador(String nome) throws RemoteException {
	try {
	    return superTrunfo.adicionarJogador(nome);
	} catch (Exception e) {
	    throw new RemoteException(e.getMessage());
	}
    }

    @Override
    public void escolherCaracteristica(int id_jogo, String id_caracteristica)
	    throws RemoteException {
	try {
	    superTrunfo.definirCaracteristica(id_jogo, id_caracteristica);
	} catch (Exception e) {
	    throw new RemoteException(e.getMessage());
	}
	
    }

    @Override
    public ArrayList<Jogador> retornaVencedorRodada(int id_jogo)
	    throws RemoteException {
	try {
	    return superTrunfo.getVencedorRodada(id_jogo);
	} catch (Exception e) {
	    throw new RemoteException(e.getMessage());
	}
    }

    @Override
    public Carta getCarta(int id_jogo, int id_jogador) throws RemoteException {
    	try {
    		return superTrunfo.retornaCartaRodada(id_jogo, id_jogador);
    	} catch (Exception e) {
    		throw new RemoteException(e.getMessage());
    	}
    }


    @Override
    public Jogador getJogadorRodada(int id_jogo) throws RemoteException {
	try {
	    return superTrunfo.retornaJogadorRodada(id_jogo);
	} catch (Exception e) {
	    throw new RemoteException(e.getMessage());
	}
    }
    
    public void BuscarJogosParados() {
    	for(Jogo jogo : jogosEmAndamento()) {
    		int segundos = (int) ((System.currentTimeMillis() - jogo.getUltimaJogada())/1000);
    		if(segundos == 60) {
    			System.out.println("\nJogo com ID: " + jogo.getId() +  " a mais de 60 segundos sem jogadas, vou escolher uma caracteristica randomicamente");
    			jogo.setCaracteristicaRandom();
    		}
    	}
    }
}